package com.evancharlton.mileage.io; import com.evancharlton.mileage.R; import com.evancharlton.mileage.dao.Fillup; import com.evancharlton.mileage.provider.tables.FillupsTable; import android.database.Cursor; import android.net.Uri; import au.com.bytecode.opencsv.CSVWriter; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.text.DateFormat; import java.util.Date; public class CsvExportActivity extends BaseExportActivity { @Override protected ExportTask createExportTask() { return new CsvExportTask(); } private static final class CsvExportTask extends ExportTask { @Override public String performExport(String inputFile, String outputFile) { try { BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile)); CSVWriter csvWriter = new CSVWriter(writer); // TODO(3.5) - export more than just fillup data Uri uri = FillupsTable.BASE_URI; Cursor fillups = mActivity.getContentResolver().query(uri, FillupsTable.CSV_PROJECTION, null, null, null); final int FILLUP_COUNT = fillups.getCount(); publishProgress(new Update(0, FILLUP_COUNT + 1)); final int COLUMN_COUNT = FillupsTable.CSV_PROJECTION.length; String[] data = new String[COLUMN_COUNT]; // write the column data first for (int i = 0; i < COLUMN_COUNT; i++) { data[i] = mActivity.getString(FillupsTable.PLAINTEXT[i]); } csvWriter.writeNext(data); csvWriter.flush(); publishProgress(new Update(mActivity.getString(R.string.update_wrote_headers), 1)); // figure out what columns are where, for formatting purposes int COLUMN_DATE = -1; for (int i = 0; i < COLUMN_COUNT; i++) { if (FillupsTable.CSV_PROJECTION[i].equals(Fillup.DATE)) { COLUMN_DATE = i; } } final DateFormat DATE_FORMAT = android.text.format.DateFormat .getDateFormat(mActivity); // now write the real data int numWritten = 0; while (fillups.moveToNext()) { for (int i = 0; i < COLUMN_COUNT; i++) { if (i == COLUMN_DATE) { data[i] = DATE_FORMAT.format(new Date(fillups.getLong(i))); } else { data[i] = fillups.getString(i); } } csvWriter.writeNext(data); if (++numWritten % 10 == 0) { sendUpdate(numWritten, FILLUP_COUNT); csvWriter.flush(); } else { publishProgress(new Update(numWritten)); } } sendUpdate(numWritten, FILLUP_COUNT); csvWriter.flush(); csvWriter.close(); fillups.close(); return outputFile; } catch (IOException e) { } return null; } private void sendUpdate(int num_written, final int total) { publishProgress(new Update(mActivity.getString(R.string.update_wrote_rows, num_written, total), num_written)); } } }